﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CapaPresentacion.Commands;
using CapaPresentacion.Vistas;
using Entidades;
using CapaLogica;
using System.Windows.Input;
using System.Windows;
using System.Windows.Data;
using System.Transactions;
using System.Collections.ObjectModel;
using System.Globalization;

namespace CapaPresentacion.Controles
{
    class NuevaActividadViewModel
    {

        public event ReiniciarCU ReiniciarCU;

        #region Variables

        private NuevaActividad view;

        private ActividadDidactica actividadDidactica;
        private ActividadDidactica actividadDidacticaSinModificaciones;
        private RelayCommand saveCommand;
        private RelayCommand newCommand;
        private RelayCommand openCommand;
        private RelayCommand agregarCommand;
        private RelayCommand quitarCommand;

        // Es necesario que la Lista sea pública y esté creada a nivel de clase
      //  public ObservableCollection<string> ListaMateriales { get; set; }

        #endregion

        #region Propiedades


        public ICommand SaveCommand
        {
            get
            {
                return saveCommand;
            }
        }

        public ICommand NewCommand
        {
            get
            {
                return newCommand;
            }
        }

        public ICommand OpenCommand
        {
            get
            {
                return openCommand;
            }
        }

        public ICommand AgregarCommand
        {
            get
            {
                return agregarCommand;
            }
        }

        public ICommand QuitarCommand
        {
            get
            {
                return quitarCommand;
            }
        }

        public ActividadDidactica ActividadDidactica
        {
            get { return actividadDidactica; }
            set { actividadDidactica = value; }
        }

        #endregion


        public NuevaActividadViewModel( NuevaActividad vista)
        {
            this.view = vista;
            this.actividadDidactica = new ActividadDidactica();
            this.actividadDidactica.Eliminada = false;
            this.saveCommand = new RelayCommand(GuardarActividadDidactica);
            this.newCommand = new RelayCommand(NuevaActividadDidactica);
            this.openCommand = new RelayCommand(AbrirActividadDidactica);
            this.agregarCommand = new RelayCommand(AgregarMaterial);
            this.quitarCommand = new RelayCommand(QuitarMaterial);

      //      ListaMateriales = new ObservableCollection<string>();

        }

        public NuevaActividadViewModel(NuevaActividad vista, ActividadDidactica entidad)
        {
            this.view = vista;
            this.actividadDidactica = entidad;
            this.actividadDidacticaSinModificaciones = (ActividadDidactica)entidad.Clone();
 //           this.ListaMateriales = new ActividadDidacticaLogica().ObtenerMaterialesDeActividad(entidad.IdActividad);
            this.saveCommand = new RelayCommand(GuardarActividadDidactica);
            this.newCommand = new RelayCommand(NuevaActividadDidactica);
            this.openCommand = new RelayCommand(AbrirActividadDidactica);
            this.agregarCommand = new RelayCommand(AgregarMaterial);
            this.quitarCommand = new RelayCommand(QuitarMaterial);

       //     ListaMateriales = new ActividadDidacticaLogica().ObtenerMaterialesDeActividad(actividadDidactica.IdActividad);

        }

        private void NuevaActividadDidactica(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea crear una nueva actividad?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.NuevaActividadDidactica);
            }
        }

         private void AbrirActividadDidactica(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea editar una actividad existente?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.BuscarActividadDidactica);
            }
        }


        private void GuardarActividadDidactica(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea guardar los datos?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {

                if (Validaciones())
                {

                    try
                    {

                        this.actividadDidactica.NombreActividad = CultureInfo.InvariantCulture.TextInfo.ToTitleCase(this.actividadDidactica.NombreActividad);

                        if (actividadDidactica.IdActividad == Guid.Empty) // Nueva Actividad
                        {
                            actividadDidactica.IdActividad = Guid.NewGuid();
                          
                            new ActividadDidacticaLogica().Agregar(actividadDidactica);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "La actividad didáctica ha sido guardada correctamente");
                            nueva.ShowDialog();

                            this.ReiniciarCU(CasosDeUso.NuevaActividadDidactica);

                        }
                        else // Modificación de Actividad
                        {
                        //    new ActividadDidacticaLogica().EliminarMaterialesDeActividad(actividadDidactica.IdActividad);
                                                       
                            new ActividadDidacticaLogica().Modificar(actividadDidactica);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "La actividad didáctica ha sido modificada correctamente");
                            nueva.ShowDialog();
                            this.ReiniciarCU(CasosDeUso.NuevaActividadDidactica);

                        }

                    }
                    catch (Exception)
                    {

                        VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "  Ha ocurrido un error y la actividad didáctica no se ha guardado");
                        nueva.ShowDialog();

                    }

                }
            }


        }


        private void AgregarMaterial(Object parameter)
        {
            if (this.view.txtNombreMaterial.Text != String.Empty)
            {
                bool existe = false;
                foreach (var v in actividadDidactica.MaterialesActividad)
                {
                    if (v.DescripcionMaterial.ToLower() == this.view.txtNombreMaterial.Text.Trim().ToLower())
                        existe = true;

                }
                if (!existe)
                {
                    MaterialActividad nuevo = new MaterialActividad();
                    nuevo.IdActividad =actividadDidactica.IdActividad;
                    nuevo.DescripcionMaterial = this.view.txtNombreMaterial.Text.Trim();

                    actividadDidactica.MaterialesActividad.Add(nuevo);
                    this.view.txtNombreMaterial.Text = String.Empty;
                }


            }
        }

        private void QuitarMaterial(Object parameter)
        {
            if (this.view.listaDatos.SelectedIndex != -1)
                actividadDidactica.MaterialesActividad.RemoveAt(this.view.listaDatos.SelectedIndex);

        }




        private bool Validaciones()
        {
            if (actividadDidactica.NombreActividad == null || actividadDidactica.NombreActividad == "")
            {
                if (actividadDidacticaSinModificaciones != null)
                    this.actividadDidactica.NombreActividad = this.actividadDidacticaSinModificaciones.NombreActividad;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Nombre de la actividad' no puede estar vacío");
                nueva.ShowDialog();
                return false;
            }
            else
            {
                bool nombreDuplicado = new ActividadDidacticaLogica().VerificarNombreDuplicado(actividadDidactica.NombreActividad, actividadDidactica.IdActividad);

                if (nombreDuplicado)
                {
                    if (actividadDidacticaSinModificaciones != null)
                        this.actividadDidactica.NombreActividad = this.actividadDidacticaSinModificaciones.NombreActividad;

                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El Nombre de la actividad ya existe, debe elegir otro nombre");
                    nueva.ShowDialog();
                    return false;

                }

            }
            
            if (actividadDidactica.DescripcionActividad == null || actividadDidactica.DescripcionActividad == "")
            {
                if (actividadDidacticaSinModificaciones != null)
                    this.actividadDidactica.DescripcionActividad = this.actividadDidacticaSinModificaciones.DescripcionActividad;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Descripción de la actividad' no puede estar vacío");
                nueva.ShowDialog();
                return false;
            }

            if (actividadDidactica.DuracionActividad.ToString() == "")
            {
                if (actividadDidacticaSinModificaciones != null)
                    this.actividadDidactica.DuracionActividad = this.actividadDidacticaSinModificaciones.DuracionActividad;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "La 'Duración de la actividad' no puede estar vacía");
                nueva.ShowDialog();
                return false;
            }

            if (actividadDidactica.DuracionActividad < 10)
            {
                if (actividadDidacticaSinModificaciones != null)
                    this.actividadDidactica.DuracionActividad = this.actividadDidacticaSinModificaciones.DuracionActividad;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "La 'Duración de la actividad' no puede ser menor a 10 minutos");
                nueva.ShowDialog();
                return false;
            } 

            return true;
        }





    }
}
